import {hasOwn, isDef} from "../../shared/util";

/**
 * 是否是真实节点
 * @param {Node | VNode} node
 * @return {boolean}
 */
export function isRealNode (node) {
    return isDef(node.ownerDocument)
        && !isDef(node.elem);
}

/**
 * 判断两者是否是同一节点
 * @param {HTMLElement | VNode} one
 * @param {HTMLElement | VNode} other
 * @return {boolean}
 */
export function isSameNode (one, other) {
    // one 是真实节点, 不可能是组件节点
    // 组件节点之间比较一定是 vnode 与 vnode 比较
    if (isRealNode(one)) {
        return one.tagName.toLowerCase() === other.tag
            && one.nodeType === other.nodeType
            && (
                (isDef(one.key) && isDef(other.key))
                    ? one.key === other.key
                    : true
            );
    }
    // vnode 与 vnode 比较
    // 可能存在的情况
    // 组件节点 与 组件节点 比较
    // 组件节点 与 普通节点 比较
    // 普通节点 与 普通节点 比较
    else {
        return one.tag === other.tag
            && one.nodeType === other.nodeType
            // 节点key比较
            && (
                (isDef(one.key) && isDef(other.key))
                    ? one.key === other.key
                    : true
            )
            // 组件内容比较
            && (
                (one.isComponent === other.isComponent && one.isComponent === true)
                    ? one.componentOptions.tag === other.componentOptions.tag
                    : true
            );
    }
}

// /**
//  *
//  * @param one
//  * @param other
//  * @return {boolean}
//  */
// export function isSameStruct (one, other) {
//     return false;
// }
//
// /**
//  * 检查真实节点 与 虚拟节点在 class, style 上的不同
//  * @param {HTMLElement} one
//  * @param {VNode} other
//  * @return {boolean}
//  */
// export function needUpdateAttribute (one, other) {
//     return true;
// }
//
// /**
//  * 检查两个虚拟 DOM 节点在 data 属性上的不同
//  * 根据不同的程度判断是否需要重新渲染
//  * @param {VNode} one
//  * @param {VNode} other
//  * @return {boolean}
//  */
// export function needUpdateData (one, other) {
//     // attrs
//     if (one.data.attrs.length !== other.data.attrs.length) {
//         return false;
//     }
//     // on
//     if (one.data.on.length !== other.data.on.length) {
//         return false;
//     }
//     // bindAttrs
//     if (hasOwn(one.data, 'bindAttrs') && hasOwn(other.data, 'bindAttrs')) {
//         if (one.data.bindAttrs.length !== other.data.bindAttrs.length) {
//             return false;
//         }
//     }
//     else if (hasOwn(one.data, 'bindAttrs') || hasOwn(other.data, 'bindAttrs')) {
//         return false;
//     }
//     // bindOn
//     if (hasOwn(one.data, 'bindOn') && hasOwn(other.data, 'bindOn')) {
//         if (one.data.bindOn.length !== other.data.bindOn.length) {
//             return false;
//         }
//     }
//     else if (hasOwn(one.data, 'bindOn') || hasOwn(other.data, 'bindOn')) {
//         return false;
//     }
// }

/**
 * 获取旧孩子节点的 key 与 index 的关联
 * @param {Array<VNode|Node>} oldChildren
 * @param {Number} oldStartIndex
 * @param {Number} oldFinishIndex
 * @return {Object}
 */
export function keyToIndex (
    oldChildren,
    oldStartIndex,
    oldFinishIndex) {
    let keyToIndexOld = new Map();
    for (let i=oldStartIndex; i<=oldFinishIndex; i++) {
        const node = oldChildren[i];
        keyToIndexOld[node.key] = node;
    }
    return keyToIndexOld;
}
